#include "./handler.h"
#include "./reader.h"
#include "./request.h"
#include "../service/ota.h"

namespace conn {

using namespace driver;
using namespace service;

static ProtoReader<256, 100> cmdReader;
static bool sessionFlag = false;

static void simple_req(const RequestRef &msg) {

#ifdef BUILD_APP
    switch (msg.cmd()) {
        case cmd::OTA_START: ota::start(msg); break;
        case cmd::OTA_TRANSLATE: ota::translate(msg); break;
        case cmd::OTA_COMPAT: ota::complete(msg); break; 
    }
#endif

}

static void session(const RequestRef &msg) {
    sessionFlag = true;
    cmdUart.ack(msg.seq());
}

static void dispatch(const RequestRef &msg) {
    uint8_t type = msg.type();
    switch (type) {
        case type::PING: cmdUart.pong(msg.seq()); break; 
        case type::SIMPLE_REQ: simple_req(msg); break;
        case type::SESSION: session(msg); break;
    }
}

void handler() {

    for (;;) {
        auto bw = cmdReader.read();
        RequestRef msg(bw.buf, bw.len);
        dispatch(msg);
    }    
}

}
